<?php

namespace App\Admin\Controllers;

use App\Models\Category;
use App\Http\Controllers\Controller;
use Encore\Admin\Controllers\HasResourceActions;
use Encore\Admin\Form;
use Encore\Admin\Grid;
use Encore\Admin\Layout\Content;
use Encore\Admin\Show;
use Illuminate\Http\Request;

class CategoriesController extends Controller
{
    use HasResourceActions;

    /**
     * Index interface.
     *
     * @param  Content  $content
     * @return Content
     */
    public function index(Content $content)
    {
        return $content
            ->header('商品类目列表')
            ->body($this->grid());
    }

    /**
     * Edit interface.
     *
     * @param $id
     * @param  Content  $content
     * @return Content
     */
    public function edit($id, Content $content)
    {
        return $content
            ->header('编辑商品类目')
            ->body($this->form(true)->edit($id));
    }

    /**
     * Create interface.
     *
     * @param  Content  $content
     * @return Content
     */
    public function create(Content $content)
    {
        return $content
            ->header('创建商品类目')
            ->body($this->form(false));
    }

    /**
     * Make a grid builder.
     *
     * @return Grid
     */
    protected function grid()
    {
        $grid = new Grid(new Category);

        $grid->id('Id')->sortable();
        $grid->name('名称');
        $grid->level('层级');
        $grid->is_directory('是否目录')->display(
            function ($value) {
                return $value ? '是' : '否';
            }
        );
        $grid->path('类目路径');
        $grid->actions(
            function ($actions) {
                // 不展示 laravel-Admin 默认的查看按钮
            }
        );

        return $grid;
    }


    /**
     * Make a form builder.
     *
     * @param  bool  $isEditing
     * @return Form
     */
    protected function form($isEditing = false)
    {
        $form = new Form(new Category);

        $form->text('name', '类目名称')->rules('required');
        if ($isEditing) {
            // 如果是编辑模式
            // 不允许用户改 [是否目录] 和 [父类目] 字段值
            // 用 display() 方法来展示, with() 方法接受一个匿名函数，会把字段值传递给匿名函数并把返回值展示出来
            $form->display('is_directory', '是否目录')->with(
                function ($value) {
                    return $value ? '是' : '否';
                }
            );
            // 支持用符号，来展示关联关系的字段
            $form->display('parent.name', '父类目');
        } else {
            // 定义一个 名为 [是否目录] 的单选
            $form->radio('is_directory', '是否目录')->options(['1' => '是', '0' => '否'])->default('0')->rules('required');
            // 定义一个名为父类目的下拉框
            $form->select('parent_id', '父类目')->ajax('/admin/api/categories');
        }

        return $form;
    }

    /**
     * 获取父类目
     *
     * @param  Request  $request
     * @return \Illuminate\Contracts\Pagination\LengthAwarePaginator
     */
    public function apiIndex(Request $request)
    {
        // 用户输入的值 通过 q 参数获取
        $search = $request->input('q');
        $result = Category::query()->where('is_directory', boolval($request->input('is_directory', true)))->where('name', 'like', '%'.$search.'%')->paginate();
        // 把查询出来的结果重新组装成 laravel-Admin 需要的格式
        $result->setCollection(
            $result->getCollection()->map(
                function (Category $category) {
                    return ['id' => $category->id, 'text' => $category->full_name];
                }
            )
        );

        return $result;
    }
}
